package br.org.acessobrasil.portal.action;

import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;
import org.springframework.transaction.annotation.Transactional;

import br.org.acessobrasil.portal.modelo.Menu;
import br.org.acessobrasil.portal.modelo.Sitio;
import br.org.acessobrasil.portal.modelo.Usuario;
import br.org.acessobrasil.portal.persistencia.ConteudoDaoSpring;
import br.org.acessobrasil.portal.persistencia.FormatoDaoSpring;
import br.org.acessobrasil.portal.persistencia.InformacaoTipoConteudoDao;
import br.org.acessobrasil.portal.persistencia.ItemMenuDaoSpring;
import br.org.acessobrasil.portal.persistencia.MenuDaoSpring;
import br.org.acessobrasil.portal.persistencia.PadraoApresentacaoDaoSpring;
import br.org.acessobrasil.portal.persistencia.PaginaDaoSpring;
import br.org.acessobrasil.portal.persistencia.PerfilDaoSpring;
import br.org.acessobrasil.portal.persistencia.PrivilegioDaoSpring;
import br.org.acessobrasil.portal.persistencia.SetorDao;
import br.org.acessobrasil.portal.persistencia.SitioDaoSpring;
import br.org.acessobrasil.portal.persistencia.TipoConteudoDaoSpring;
import br.org.acessobrasil.portal.persistencia.UsuarioDaoSpring;
/**
 * Responsavel por operacoes em sitio
 * @author Fabio Issamu Oshiro, Jonatas Pacheco, Daniel Zupo
 */
@Transactional
public class SitioAction extends Super implements SitioActionInterface{
	private static final long serialVersionUID = 8546431301417212475L;
	private static Logger logger = Logger.getLogger(SitioAction.class);
	public static SitioDaoSpring sitioDao;
	public static MenuDaoSpring menuDao;
	protected static UsuarioDaoSpring usuarioDao;
	protected static PerfilDaoSpring perfilDao;
	protected static SetorDao setorDao;
	protected static PrivilegioDaoSpring privilegioDao;
	protected static PaginaDaoSpring paginaDao;
	protected static PadraoApresentacaoDaoSpring padraoApresentacaoDao;
	protected static ItemMenuDaoSpring itemMenuDao;
	protected static TipoConteudoDaoSpring tipoConteudoDao;
	protected static FormatoDaoSpring formatoDao;
	protected static InformacaoTipoConteudoDao informacaoTipoConteudoDao;
	protected static ConteudoDaoSpring conteudoDao;
	private Sitio sitio;
	private List<Sitio> listSitio;
	private List<Menu> listMenu;
	public SitioAction(
			UsuarioDaoSpring usuarioDao,
			PerfilDaoSpring perfilDao,
			SetorDao setorDao,
			SitioDaoSpring sitioDao, 
			PrivilegioDaoSpring privilegioDao,
			PaginaDaoSpring paginaDao,
			PadraoApresentacaoDaoSpring padraoApresentacaoDao,
			MenuDaoSpring menuDao,
			ItemMenuDaoSpring itemMenuDao,
			TipoConteudoDaoSpring tipoConteudoDao,
			FormatoDaoSpring formatoDao,
			InformacaoTipoConteudoDao  informacaoTipoConteudoDao,
			ConteudoDaoSpring conteudoDao
			){
		SitioAction.usuarioDao = usuarioDao;
		SitioAction.perfilDao = perfilDao;
		SitioAction.setorDao = setorDao;
		SitioAction.sitioDao = sitioDao;
		SitioAction.privilegioDao = privilegioDao;
		SitioAction.paginaDao = paginaDao;
		SitioAction.padraoApresentacaoDao = padraoApresentacaoDao;
		SitioAction.menuDao = menuDao;
		SitioAction.itemMenuDao = itemMenuDao;
		SitioAction.tipoConteudoDao = tipoConteudoDao;
		SitioAction.formatoDao = formatoDao;
		SitioAction.informacaoTipoConteudoDao = informacaoTipoConteudoDao; 
		SitioAction.conteudoDao = conteudoDao;
		//TODO retirar a linha abaixo?
		//listMenu=menuDao.list();
		listSitio=sitioDao.list();
	}
	
	
	
	/* (non-Javadoc)
	 * @see br.org.acessobrasil.portal.action.SitioActionInterface#adicionarSitio()
	 */
	@Transactional
	public String adicionarSitio(){
		Usuario usuario = getUsuarioLogado();
		listSitio=sitioDao.list();
		listMenu=menuDao.list(getSitioAtual());
		if(sitio==null){
			return INPUT;
		}
		if(sitio.getNoPastaArquivos().trim().isEmpty()){
			usuario.addActionError(getText("invalid.fieldvalue.pastaArquivos"));
			return INPUT;
		}
		if(sitioDao.buscarPorPastaArquivos(sitio.getNoPastaArquivos()) != null ){
			usuario.addActionError(getText("invalid.fieldvalue.pastaArquivos.existente"));
			return INPUT;
		}
		criarSitioPadrao();
		return SUCCESS;
	}
	
	public void criarSitioPadrao(){
		Usuario usuarioLogado = getUsuarioLogado();
		try{
			logger.debug("Iniciando a criacao padrao do sitio...");
			Instalador instalador = new Instalador(usuarioDao,perfilDao,setorDao,sitioDao,privilegioDao,paginaDao,padraoApresentacaoDao,menuDao,itemMenuDao,tipoConteudoDao,formatoDao,informacaoTipoConteudoDao,conteudoDao);
			
			sitioDao.create(sitio);
			instalador.criarSitioBase(sitio);
			//Se ele nao possuir permissao para ver o sitio
			if(!usuarioLogado.getListSitio().contains(sitio)){
				//atribui a permissao
				usuarioLogado = usuarioDao.select(usuarioLogado.getNuUsuario());
				if(!usuarioLogado.getListSitio().contains(sitio)){
					usuarioLogado.getListSitio().add(sitio);
					usuarioDao.update(usuarioLogado);
				}
				//atualiza na sessao
				setUsuarioLogado(usuarioLogado);
			}
			logger.debug("Criacao do sitio finalizada!");
			usuarioLogado.addActionMessage(getText("sucesso.sitio.criado"));
		}catch(Exception e){
			logger.error("Erro ao criar sitio padrao.",e);
			usuarioLogado.addActionError("Erro: " + e.getMessage());
			throw new RuntimeException(e.getMessage());
		}
	}
	
	/* (non-Javadoc)
	 * @see br.org.acessobrasil.portal.action.SitioActionInterface#preAdicionarSitio()
	 */
	public String preAdicionarSitio() {
		listMenu=menuDao.list(getSitioAtual());
		if (sitio==null){
			sitio= new Sitio(); 
			sitio.setNoSitio(getText("predefinido.nome"));
			sitio.setDeSitio(getText("predefinido.descricao"));
		}
		return SUCCESS;
	}
	
	/* (non-Javadoc)
	 * @see br.org.acessobrasil.portal.action.SitioActionInterface#listar()
	 */
	public String listar() {
		listMenu=menuDao.list(getSitioAtual());
		listSitio = getUsuarioLogado().getListSitio();
		List<Sitio> atual = new ArrayList<Sitio>();
		for(Sitio sitio:listSitio){
			atual.add(sitioDao.select(sitio.getNuSitio()));
		}
		getUsuarioLogado().setListSitio(atual);
		listSitio = atual;
		return SUCCESS;
	}
	
	/* (non-Javadoc)
	 * @see br.org.acessobrasil.portal.action.SitioActionInterface#carregarSitio()
	 */
	public String carregarSitio() {
		if (sitio != null && !sitio.getNuSitio().equals(0L)) {
			try {
				sitio=sitioDao.select(sitio);
				//carregar os menus deste sitio que foi aberto
				listMenu=menuDao.list(sitio);
				return SUCCESS;
			} catch (Exception e) {
				logger.error("Erro ao carregar sitio", e);
				return ERROR;
			}
		}
		return ERROR;
	}
	
	/* (non-Javadoc)
	 * @see br.org.acessobrasil.portal.action.SitioActionInterface#deletarSitio()
	 */
	public String deletarSitio(){
		if(btnCancelar==null) {
			try {
				//atualizar a sessao
				listSitio = getUsuarioLogado().getListSitio();
				listSitio.remove(sitio);
				setUsuarioLogado(getUsuarioLogado());
				
				//apagar do banco
				sitioDao.delete(sitio.getNuSitio());
				
				//mostrar mensagem
				setMensagem(getText("sucesso.sitio.deletado"));				
			} catch (Exception e) {
				setMensagem(getText("errors.general"));
				logger.error("Erro ao apagar sitio",e);
				return INPUT;
			}
		}
		return SUCCESS;
	}
		
	/* (non-Javadoc)
	 * @see br.org.acessobrasil.portal.action.SitioActionInterface#atualizarSitio()
	 */
	public String atualizarSitio() {
		Usuario usuario = getUsuarioLogado();
		Sitio sitioBanco = sitioDao.select(sitio);
		Sitio sitioPastaIgual =  sitioDao.buscarPorPastaArquivos(sitio.getNoPastaArquivos());
		if(sitioPastaIgual != null && sitioPastaIgual.getNuSitio() != sitioBanco.getNuSitio()){
			usuario.addActionError(getText("invalid.fieldvalue.pastaArquivos.existente"));
			listMenu=menuDao.list(sitioBanco);
			return INPUT;
		}
		sitioBanco.setDeSitio(sitio.getDeSitio());
		sitioBanco.setNoSitio(sitio.getNoSitio());
		sitioBanco.setUrl(sitio.getUrl());
		sitioBanco.setNoPastaArquivos(sitio.getNoPastaArquivos());
		sitioBanco.setNuMenuPrincipal(sitio.getNuMenuPrincipal());
		try {
			sitioDao.update(sitioBanco);
			//carregar os menus deste sitio que foi aberto
			listMenu=menuDao.list(sitioBanco);
			usuario.addActionMessage((getText("sucesso.sitio.atualizado")));
		} catch (Exception e) {
			usuario.addActionError(e.getMessage());
			logger.error("Erro ao atualizar o sitio",e);
		}
		return  SUCCESS;
	}

	/* (non-Javadoc)
	 * @see br.org.acessobrasil.portal.action.SitioActionInterface#getListSitio()
	 */
	public List<Sitio> getListSitio() {
		return listSitio;
	}

	/* (non-Javadoc)
	 * @see br.org.acessobrasil.portal.action.SitioActionInterface#setListSitio(java.util.List)
	 */
	public void setListSitio(List<Sitio> listSitio) {
		this.listSitio = listSitio;
	}

	
	/* (non-Javadoc)
	 * @see br.org.acessobrasil.portal.action.SitioActionInterface#getListMenu()
	 */
	public List<Menu> getListMenu() {
		return listMenu;
	}

	/* (non-Javadoc)
	 * @see br.org.acessobrasil.portal.action.SitioActionInterface#setListMenu(java.util.List)
	 */
	public void setListMenu(List<Menu> listMenu) {
		this.listMenu = listMenu;
	}

	/* (non-Javadoc)
	 * @see br.org.acessobrasil.portal.action.SitioActionInterface#getMenuDao()
	 */
	public MenuDaoSpring getMenuDao() {
		return menuDao;
	}

	/* (non-Javadoc)
	 * @see br.org.acessobrasil.portal.action.SitioActionInterface#getSitio()
	 */
	public Sitio getSitio() {
		return sitio;
	}

	/* (non-Javadoc)
	 * @see br.org.acessobrasil.portal.action.SitioActionInterface#setSitio(br.org.acessobrasil.portal.modelo.Sitio)
	 */
	public void setSitio(Sitio sitio) {
		this.sitio = sitio;
	}

	
	
}
